package com.iuie.ns.frame.persistence.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;

import com.iuie.ns.frame.web.dataset.vo.Page;

/**
 * Dao基础接口
 * 
 * @author lj
 * @createTime 2017年1月2日 下午4:02:06
 * @param <T>
 *            查询结果的类型
 * @param <Serializable>
 *            数据库表的id字段的数据类型，一定是经过序列化的
 */
public interface IGenericDao<T, BK extends Serializable> {

	/**
	 * 条件查询匹配类型，依据Criteria的查询方式
	 * 
	 * @author lj
	 * @createTime 2017年1月2日 下午2:44:07
	 */
	public enum MatchType {
		/**
		 * 对应Restrictions.eq方法
		 */
		MATCH_EQ,
		/**
		 * 对应Restrictions.like方法
		 */
		MATCH_LIKE,
		/**
		 * 数值类型时有效，小于， 对应Restrictions.lt方法
		 */
		MATCH_LT,
		/**
		 * 数值类型时有效，大于， 对应Restrictions.gt方法
		 */
		MATCH_GT;
	}

	/**
	 * 通过id获取对象
	 * 
	 * @param id
	 * @return
	 */
	public T findById(Serializable id);

	/**
	 * 获取session
	 * 
	 * @return
	 */
	public Session getCurrentSession();

	/**
	 * 清理session
	 * 
	 * @createTime 2017年1月2日 下午4:04:40
	 */
	public void clear();

	/**
	 * 持久化游离对象
	 * 
	 * @createTime 2017年1月2日 下午4:04:58
	 * @param t
	 * @return 得到持久化对象
	 */
	public Serializable save(T t);

	/**
	 * 删除对象
	 * @createTime 2017年1月2日 下午4:52:50
	 * @param t
	 */
	public void delete(T t);
	
	/**
	 * 根据id删除持久化对象
	 * @createTime 2017年1月2日 下午4:53:19
	 * @param id
	 */
	public void deleteById(Serializable id);

	/**
	 * 更新对象
	 * @createTime 2017年1月11日 上午10:21:54
	 * @param t
	 */
	public void update(T t);

	/**
	 * 无条件的查询所有对象
	 * @return
	 */
	public List<T> findAll();
	/**
	 * 有条件的查询所有对象，不带查询条件描述
	 * @createTime 2017年1月2日 下午4:48:46
	 * @param t
	 * @return
	 */
	public List<T> findAll(T t);

	/**
	 * 有条件的查询所有对象
	 * @param t 查询的对象
	 * @param map criteria的查询条件描述
	 * @return
	 */
	public List<T> findAll(T t, Map<String, MatchType> map);
	
	/**
	 * 分页查询
	 * @param t 查询条件信息
	 * @param page 分页信息
	 * @return
	 */
	public List<T> findByPage(T t, Page page);

	/**
	 * 分页查询
	 * @param t 查询条件信息
	 * @param page 分页信息
	 * @param map 条件查询描述
	 * @return
	 */
	public List<T> findByPage(T t, Page page, Map<String, MatchType> map);

	/**
	 * 批量删除
	 * @param list
	 * @return
	 */
	public int batchDelete(List<Integer> ids);

	/**
	 * 批量更新
	 * 
	 * @param list
	 * @return
	 */
	public boolean batchUpdate(List<T> list);
	
	/**
	 * 获取持久化对象
	 * @createTime 2017年1月9日 上午10:09:05
	 * @param clazz
	 * @param id
	 * @return
	 */
	public T load(Serializable id);

	/**
	 * 持久化对象
	 * @createTime 2017年1月11日 上午10:25:01
	 * @param object
	 */
	public void persist(T object);
	/**
	 * 创建查询
	 * @param hql 查询语句
	 * @createTime 2017年1月21日 下午3:44:51
	 * @return
	 */
	public Query createQuery(String hql);
	
	/**
	 * 保存或修改对象
	 * @createTime 2017年4月4日15:03:14
	 * @param object
	 */
	public void saveOrUpdate(T object);


}
